import pymysql


class DBUtil:

    #定义类属性
    conn=None

    #封装一个创建数据库连接的方法，添加装饰器@classmethod为了调用方便
    #添加cls.类属性，目的是为了让其他的方法进行调用，把这个连接对象返回，因为query_db(),uid_db()要用这个数据库的连接对象conn
    @classmethod
    def __connect_db(cls):
        cls.conn =conn = pymysql.connect(host="211.103.136.244", port=7061, user="student", password="iHRM_student_2022",
                           database="ihrm", charset="utf8")
        return cls.conn
        pass
    #封装一个关闭数据库链接的方法，把connect_db,close_db这两个方法变成私有
    # 添加__()，目的是为了不让调用方看到内部方法的实现(调用方不关心)
    @classmethod
    def __close_db(cls):
        cls.conn.close()
        pass

        # 封装一个读取数据库的方法
    @classmethod
    def query_db(cls,sql):
        result=None
        cursor=None
        try:
         #1.创建数据库的连接
            cls.conn=cls.__connect_db()
        #2.获取游标
            cursor=cls.conn.cursor()
        #3.执行sql，获取结果集，需要返回结果
            cursor.execute(sql)
            result=cursor.fetchone()
        except Exception as err:
            print('读取数据库报错：',err)
        finally:
        #4.关闭游标
            cursor.close()
        #5.关闭数据库连接
            cls.__close_db()
            return result

    #封装一个增删数据库的方法
    @classmethod
    def uid_db(cls,sql):
        cursor=None
        try:
           # 1.创建数据库的连接
            cls.conn = cls.__connect_db()
        # 2.获取游标
            cursor = cls.conn.cursor()
        # 3.执行sql，获取结果集，需要返回结果
            cursor.execute(sql)
            print('影响数据库的行数=',cls.conn.affected_rows())
        #4.事务的提交和回滚
            cls.conn.commit()
        except Exception as err:
            print('增删改数据库报错:',err)
            cls.conn.rollback()
        finally:
            # 4.关闭游标
            cursor.close()
            # 5.关闭数据库连接
            cls.__close_db()



